Не удается получить доступ к изображениям в корзине S3 с помощью когнитивной идентификации - PullRequest
0 голосов
/ 28 мая 2020

Я тестирую отображение изображений из корзины s3, используя javascript, до создания этой части приложения.

У меня есть корзина s3 (не publi c), названная в честь это сообщение: IMAGE-BUCKET Создал роль идентификации: GET-IMAGE. Я временно предоставил полный доступ s3 к роли GET-IMAGE. У меня есть CORS, определенный для ведра. Во время тестирования я отключил кеш браузера.

3 проблемы:

  • Получение ответа «403 Forbidden» при доступе к изображениям из html / script ниже.
  • Если я создаю определенное изображение publi c, это изображение отображается - проблема с большим количеством изображений.
  • Если я сделаю publi целиком c, изображения не будут отображаться

Похоже, что идентификатор Cognito не может получить доступ к корзине, или есть проблема в приведенном ниже скрипте.

Кроме того, установка bucket publi c тоже не работает, если только каждое изображение не Также установил пабли c. Эта корзина будет использоваться в частном порядке, поэтому это проблема только при устранении неполадок.

Я подключил AmazonS3FullAccess к GET-IMAGE, я также добавил следующую политику:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AccessS3BucketIMAGEBUCKET",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:ListBucket"
            ],
            "Effect": "Allow",
            "Resource": "*"
        }
    ]
}

Использование html и скрипт из AWS документации (изменен):

image

ОБНОВЛЕНИЕ: если я предоставлю publi c, прочтите в политике сегмента S3:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicRead",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::IMAGE-BUCKET/*"
        }
    ]
}

Это позволяет получить доступ к каждому изображению; решение вопроса №2 и №3. Но это делает ведро в основном publi c.

Если я изменю политику Bucket, чтобы ограничить его идентификатором Cognito, изменив принципала следующим образом, я снова не смогу получить доступ к изображениям через html / script, получение ошибок 403.

"Principal": {
    "AWS": "arn:aws:iam::547299998870:role/Cognito_GET-IMAGEIDUnauth_Role" 
}

ОБНОВЛЕНИЕ: Я читал онлайн, проверял некоторые другие связанные сообщения ... Я сократил его до базовых c компонентов, вот последняя конфигурация. Конфигурация должна быть такой же простой, как предоставление доступа к роли GET-IMAGE на основе документации:

В консоли управления IAM> Роли> роль GET-IMAGE (без аутентификации) я добавил встроенную политику:

        {
        "Sid": "VisualEditor2",
        "Effect": "Allow",
        "Action": ["s3:GetObject","s3:ListBucket"],
        "Resource": "arn:aws:s3:::IMAGE-BUCKET/*"
        }

Я удалил политику Bucket - в этом нет необходимости, у роли GET-IMAGE уже есть доступ. Ролевое доверие уже включено по умолчанию. HTML содержит учетные данные: IdentityPoolId: 'us-east-1: 9bfadd6a-xxxx-41d4-xxxx-79ad7347xxa1

Это самые основные компоненты c, больше ничего не нужно. Однако это не работает. Я сделал одно из изображений publi c, и это изображение отображается, другие изображения - ошибка 403 Forbidden.

Ответы [ 2 ]

0 голосов
/ 01 июня 2020

Я решил проблему доступа к s3, включаю все настройки и методы, которые использовал. Чтобы устранить неполадки, я начал тестирование с фактическим пользователем AWS, а затем вернулся к идентичности когнитивной системы. Я включил примечания относительно доступа пользователя AWS для справки. Я также отказался от кода AWS sample HTML и использовал простую короткую функцию для отображения вывода в консоли, используя функцию getsignedurl. Я не знаком с библиотеками AWS, и обнаружение getsignedurl помогло ускорить тестирование и, наконец, решить проблему.

Повсюду использовались следующие имена примеров: Cognito Role: GET-IMAGE S3 Bucket: IMAGE-BUCKET

Я go через Cognito и AWS пользовательский доступ к S3, используя HTML для простой демонстрации и тестирования.

С Cognito:

НАСТРОЙКИ:

Роль: создание идентификатора Cognito. Для получения инструкций и создания следуйте этому мастеру: https://console.aws.amazon.com/cognito/create/ Обратите внимание на образец кода, который AWS предоставляет после его создания - вам понадобится идентификатор пула.

Разрешения : Добавить уровень ролей И разрешения уровня S3

Уровень роли: IAM> Роли> GET-IMAGE_Unauth_Role

Добавить (JSON) к ролям Auth и UnAuth

{
"Version": "2012-10-17",
"Statement": [
    {
        "Sid": "s3Access",
        "Effect": "Allow",
        "Action": [
            "s3:GetObject"
        ],
        "Resource": [
            "arn:aws:s3:::IMAGE-BUCKET/*"
        ]}

S3: IMAGE-BUCKET> Permissions> Bucket Policy:

(JSON)

{
"Version": "2012-10-17",
"Statement": [
    {
        "Sid": "PublicRead",
        "Effect": "Allow",
        "Principal": {
            "AWS": [
                "arn:aws:iam::547999998899:user/anAWSUser",
                "arn:aws:iam::547999998899:role/Cognito_GET-IMAGEIDUnauth_Role",
                "arn:aws:iam::547999998899:role/Cognito_GET-IMAGEIDAuth_Role"
            ]
        },
        "Action": [
            "s3:GetObject"
        ],
        "Resource": [
            "arn:aws:s3:::IMAGE-BUCKET/*"
        ]
    }
]}

** Примечание. Я также добавил AWSUser для версии учетных данных для использования в следующий раздел «С учетными данными»

CORS:

IMAGE-BUCKET> Permissions> CORS

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>HEAD</AllowedMethod>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>

** Примечание. Вы можете ограничить источник в параметре AllowedOrigin.

HTML:

image

С учетными данными пользователя

Вы также можете использовать учетные данные для аутентификации пользователя для доступа к s3. В javascript выше закомментируйте учетные данные когнитивного доступа и используйте вместо них следующее:

//access key ID, Secret
var cred = new AWS.Credentials('AKXXX283988CCCAA-ACCESS-KEY','kKsCuq7a9WNohmOYY8SApewie77493LgV-SECRET');
AWS.config.credentials=cred;

Чтобы получить ключ доступа и секрет из консоли AWS: IAM> Пользователи> an-AWSUser> Security-Credentials

В разделе «Ключи доступа» , нажмите «Создать ключ доступа»

===================

Обратите внимание, что политика доверия для роли, не прошедшей проверку подлинности, создается автоматически на AWS при создании роли Cognito ID; его не нужно определять вручную, как упоминалось ранее.

Также не требуются права доступа к ресурсам на уровне списков и корзин, как в «IMAGE-BUCKET»; Getobject - это все, что нужно для прямого доступа к файлу. В моем случае я получаю доступ к изображениям по ключу, мне не нужно перечислять содержимое корзины.

Я установил права доступа к сегменту Role и S3; Я не тестировал без разрешений роли, может быть достаточно политики корзины.

0 голосов
/ 29 мая 2020

Вы неправильно определяете политику доверия для роли, не прошедшей проверку подлинности.

Согласно этой документации по доверию и разрешениям роли когнито политику доверия для роли, не прошедшей проверку подлинности, можно определить как следует:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Federated": "cognito-identity.amazonaws.com"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "cognito-identity.amazonaws.com:aud": "YOUR_IDENTITY_POOL_ID"
        },
        "ForAnyValue:StringLike": {
          "cognito-identity.amazonaws.com:amr": "unauthenticated"
        }
      }
    }
  ]
}

Когда вы используете AWS.CognitoIdentityCredentials, ваш пул идентификаторов Cognito сначала получит идентификатор веб-идентификатора для вашего пользователя. Поскольку вы не предоставляете логин с аутентифицированным токеном от поставщика удостоверений, такого как пулы пользователей Cognito или Facebook, идентификатор предназначен для неавторизованного веб-удостоверения.

Cognito затем вызовет метод assumeRoleWithWebIdentity службы токенов безопасности от вашего имени, чтобы получить учетные данные с разрешениями, которые вы определили в политике доступа неаутентифицированной роли, которая позволит веб-идентификатору получить доступ к корзине s3.

Вот почему принципал в политике доверия должен быть cognito-identity.amazonaws.com. Он предназначен для предоставления пулам идентификаторов когнитивных данных разрешение на вызов метода sts:AssumeRoleWithWebIdentity от имени веб-идентификатора для получения учетных данных IAM.

Часть роли политики доступа, которая определяет, какие пользователи, не прошедшие проверку подлинности, могут фактически do, будет по-прежнему таким, как вы изначально определили в своем сообщении:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AccessS3BucketIMAGEBUCKET",
      "Action": [
        "s3:GetObject",
        "s3:PutObject",
        "s3:ListBucket"
      ],
      "Effect": "Allow",
      "Resource": "*"
    }
  ]
}

Обновление

Я заметил, что последняя встроенная политика, которую вы опубликовали для своей неаутентифицированной роль не работает для s3.listObjects(). Он вернет 403, потому что ему нужен немного другой оператор ресурса, чтобы указать сам сегмент, а не его содержимое.

Вы можете обновить свою политику следующим образом:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject"
      ],
      "Resource": [
        "arn:aws:s3:::IMAGE-BUCKET/*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::IMAGE-BUCKET"
      ]
    }
  ]
}
...